home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / pmode / exc_dx02 / hr_timer.asm < prev    next >
Assembly Source File  |  1994-10-25  |  3KB  |  74 lines

  1.  
  2. PAGE 60, 132
  3. TITLE High Resolution Timer
  4. NAME  HiResTimer
  5. .386
  6.  
  7. _TEXT SEGMENT PUBLIC DWORD USE32 'CODE'
  8. ASSUME CS:_TEXT, DS:nothing, SS:nothing
  9. SS_DOSMEM = 34h
  10.  
  11. PUBLIC SetHiResTimer,GetHiResTimer,GetMilliSec
  12.  
  13. ;┌────────────────────────────────────────────────────────────────────────────┐
  14. ;│ Descr: sets timer 1 to update 65535*18.2 per second (1.193180 MHz)         │
  15. ;│        Does not affect INT 8 or memory refresh rate                        │
  16. ;│ Input:  None                                                               │
  17. ;│ Output: None                                                               │
  18. ;│ Regs changed: EAX                                                          │
  19. ;└────────────────────────────────────────────────────────────────────────────┘
  20.  
  21. SetHiResTimer:
  22.         mov al,00110100b           ; timer 1 in mode 2
  23.         out 43h,al
  24.         mov al,0
  25.         out 40h,al
  26.         out 40h,al
  27.         ret
  28.  
  29. ;┌────────────────────────────────────────────────────────────────────────────┐
  30. ;│ Descr:  return timer value as DWORD in EAX (actually only 6 bytes)         │
  31. ;│ Input:  None                                                               │
  32. ;│ Output: EAX                                                                │
  33. ;│ Regs changed: EBX                                                          │
  34. ;└────────────────────────────────────────────────────────────────────────────┘
  35.  
  36. GetHiResTimer:
  37.         xor eax,eax                ; clear result
  38.         out 43h,al                 ; latch counter 0
  39.         in al,40h                  ; read lsb
  40.         mov ah,al                  ; hide LSB in AH
  41.         in al,40h                  ; read msb
  42.         xchg al,ah
  43.         not ax                     ; invert AX (counter counts down)
  44.         mov bx,SS_DOSMEM           ; selector for 0 - 1Mbyte range
  45.         push es
  46.         mov es,bx
  47.         mov ebx,es:[46Ch]          ; number of 18.2 ticks since midnight
  48.         shl ebx,16                 ; make room for AX
  49.         add eax,ebx                ; number of 65535*18.2 ticks/sec
  50.         pop es                     ; approx 1193 in 1mSec
  51.         ret
  52.  
  53. ;┌────────────────────────────────────────────────────────────────────────────┐
  54. ;│ Descr:  Get # of mSec. Good to approx 14 minutes timings                   │
  55. ;│ Input:  None                                                               │
  56. ;│ Output: EAX                                                                │
  57. ;│ Regs changed: ECX, EDX                                                     │
  58. ;└────────────────────────────────────────────────────────────────────────────┘
  59.  
  60. GetMilliSec:
  61.         push ebx
  62.         call GetHiResTimer         ; get ticks in EAX
  63.         xor edx,edx                ; dividend = 0:EAX
  64.         mov ecx,1193               ; divisor = ECX
  65.         div ecx                    ; EAX = result, EDX = remainder
  66.         pop ebx
  67.         ret
  68.  
  69. _TEXT ENDS
  70.  
  71. END
  72.  
  73.  
  74.